﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using GDM.Hogar.Aplicacion.Formularios;
using GDM.Hogar.Entidades;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using Microsoft.Reporting.WinForms;

namespace GDM.Hogar.Aplicacion.Reportes
{
    public partial class FrmParteQuincenalPersonal
    #if DEBUG
     : AdaptadorFrm
    #else
     : FrmBase
    #endif
    {
        private readonly IParteQuincenalPersonalManager _parteQuincenalPersonalManager;

        public IList<ConsultaParteQuincenalPersonal> Datos { get; set; }
        public bool ConFiltro { get; set; }

        public FrmParteQuincenalPersonal(IParteQuincenalPersonalManager parteQuincenalPersonalManager)
        {
            if (parteQuincenalPersonalManager == null)
                throw new ArgumentNullException("parteQuincenalPersonalManager");

            _parteQuincenalPersonalManager = parteQuincenalPersonalManager;

            InitializeComponent();
        }

        private void SetearFechaActual()
        {
            var fechaActual = DateTime.Now;
            cmbMes.SelectedIndex = fechaActual.Month - 1;
            cmbAño.SelectedIndex = cmbAño.FindStringExact(fechaActual.Year.ToString(), 0);
        }

        private IList<ConsultaParteQuincenalPersonal> ObtenerPartesQuincenales(int mes, int año, int quincena)
        {
            var partesQuincenales = _parteQuincenalPersonalManager.ObtenerTodosPorMesQuincena(mes, año, quincena);
            partesQuincenales = partesQuincenales.GroupBy(x => x.AgenteId)
                                                 .Select(g => new { partes = g.OrderBy(x => x.FechaAComparar) })
                                                 .SelectMany(x => x.partes).ToList();
            var idAgenteActual = 0;
            foreach (var parteDiario in partesQuincenales)
            {
                if (parteDiario.AgenteId == idAgenteActual)
                {
                    parteDiario.Apellido = "";
                    parteDiario.Nombre = "";
                    parteDiario.Dni = "";
                    parteDiario.CatCar = "";
                }
                else
                {
                    idAgenteActual = parteDiario.AgenteId;
                }
            }
            return partesQuincenales;
        }

        private void BindearReporte()
        {
            if (!parteQuincenalValidador.Validate()) return;

            var quincena = rb1rQuincena.Checked ? 1 : 2;
            DateTime comienzoQuincena;
            DateTime finQuincena;
            var fechaActual = DateTime.Now;
            var mes = ConFiltro ? cmbMes.SelectedIndex + 1 : fechaActual.Month;
            var año = ConFiltro ? (int)cmbAño.SelectedItem : fechaActual.Year;
            if (quincena == 1)
            {
                comienzoQuincena = FechaHelper.InicioPrimerQuincena(mes, año);
                finQuincena = FechaHelper.FinPrimerQuincena(mes, año);
            }
            else
            {
                comienzoQuincena = FechaHelper.InicioSegundaQuincena(mes, año);
                finQuincena = FechaHelper.FinSegundaQuincena(mes, año);
            }
            rpParteQuincenalPersonal.LocalReport.SetParameters(ConFiltro
                ? new ReportParameter("Mes", (string) cmbMes.SelectedItem)
                : new ReportParameter("Mes", CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(mes)));
            rpParteQuincenalPersonal.LocalReport.SetParameters(new ReportParameter("Desde", string.Format("{0:dd/MM/yy}", comienzoQuincena)));
            rpParteQuincenalPersonal.LocalReport.SetParameters(new ReportParameter("Hasta", string.Format("{0:dd/MM/yy}", finQuincena)));
            rpParteQuincenalPersonal.LocalReport.DataSources.Clear();
            var datos = ConFiltro ? ObtenerPartesQuincenales(mes, año, quincena) : Datos;
            //const int cantIntegrantesPorPagina = 8;
            //var cantPaginas = datos.Count / cantIntegrantesPorPagina + 1;
            //var totalACompletar = (cantPaginas * cantIntegrantesPorPagina) - datos.Count;
            //for (var i = 0; i < totalACompletar; i++)
            //{
            //    datos.Add(new ConsultaParteQuincenalPersonal());
            //}
            rpParteQuincenalPersonal.LocalReport.DataSources.Add(new ReportDataSource("ParteQuincenalPersonal_DS", datos));
            rpParteQuincenalPersonal.RefreshReport();
        }

        private void CargarAñosCalendario()
        {
            for (var i = DateTime.Now.Year - 3; i <= DateTime.Now.Year; i++)
            {
                cmbAño.Items.Add(i);
            }
        }

        private void FrmParteQuincenalPersonal_Load(object sender, EventArgs e)
        {
            if (ConFiltro)
            {
                CargarAñosCalendario();
                SetearFechaActual();
                cmbAño.SelectedIndexChanged += delegate { BindearReporte(); };
                cmbMes.SelectedIndexChanged += delegate { BindearReporte(); };
                rb1rQuincena.CheckedChanged += delegate { BindearReporte(); };
                rb2daQuincena.CheckedChanged += delegate { BindearReporte(); };
            }
            panel1.Visible = ConFiltro;
            rpParteQuincenalPersonal.Messages = new MensajesReportViewer();
            rpParteQuincenalPersonal.LocalReport.SetParameters(new ReportParameter("NombreHogar", ContextoHogar.Nombre));
            BindearReporte();
        }

        private void parteQuincenalValidador_CustomValidation(object sender, Controles.Validador.Componentes.ValidationEventArgs e)
        {
            if (e.Control == cmbAño)
            {
                e.Valid = cmbAño.SelectedIndex >= 0;
            }
            if (e.Control == cmbMes)
            {
                e.Valid = cmbMes.SelectedIndex >= 0;
            }
        }
    }
}
